﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MySql.Data.MySqlClient;
using MySql.Data.Types;
using HelpSystem;

namespace DAOLayer
{
    public class CDAOTransport
    {
        private MySqlDataAdapter Adapter = null;

        private int m_ID = 0;
        private String m_GovNumber = "";
        private static CDAOTransportType m_TransportType = null;
        private String m_VIN = "";
        private DateTime m_DateTO = DateTime.MinValue;
        private int m_TransportTypeID = 0;
        //Страховки
        //Ремонты
        //Данные текущего круга если есть
        public CDAOTransport()
        {
        }
        /// <summary>
        /// Конструктор, извлекает данные о транспортном средстве 
        /// с указанным идентификатором, из базы данных.
        /// </summary>
        /// <param name="Transportions">База данных</param>
        /// <param name="ID">Идентификатор транспортного средства</param>
        public CDAOTransport(CDAOTransportions Transportions, int ID)
        {
            //if (Transportions == null)
            //    throw new NoNullAllowedException("Невозможно создать объект транспорта из не существующей базы данных.");

            //foreach (DataRow row in Transportions.TableTransport.Rows)
            //    if ((string)row["transport_id"] == ID.ToString())
            //    {
            //        CDAOTransport transport = GetFromDataRow(row);
            //        m_DateTO = transport.m_DateTO;
            //        m_VIN = transport.m_VIN;
            //        m_ID = transport.m_ID;
            //        m_TransportTypeID = transport.m_TransportTypeID;
            //        return;
            //    }
            //throw new InvalidOperationException("Транспорт с индетификатором " + ID.ToString() + " не найден.");

            //Проверяем параметры
            if (Transportions == null)
                throw new NoNullAllowedException("Невозможно создать объект транспорта. Несуществует база данных.");
            if (Transportions.Connection == null && Transportions.Connection.State == ConnectionState.Closed)
                throw new InvalidOperationException("Невозможно создать объект транспорта. Подключение к БД не установлено.");

            //Создаём и инициализируем адаптер данных
            Adapter = new MySqlDataAdapter("SELECT transport_id, transport.transport_type_id, s_transport_type.transport_type, gov_number, vin, date_to FROM transport, s_transport_type WHERE s_transport_type.transport_type_id=transport.transport_type_id AND transport_id=" + ID.ToString(),
                                           Transportions.Connection);
            Adapter.UpdateCommand = new MySqlCommand("UPDATE transport SET transport_type_id=@TypeID, gov_number=@GovNumber, vin=@VIN, date_to=@DateTO WHERE transport_id=" + ID.ToString(), 
                                                     Transportions.Connection);
            Adapter.UpdateCommand.Parameters.Add(new MySqlParameter("TypeID", MySqlDbType.UInt32, 10));
            Adapter.UpdateCommand.Parameters.Add(new MySqlParameter("GovNumber", MySqlDbType.VarChar, 10));
            Adapter.UpdateCommand.Parameters.Add(new MySqlParameter("VIN", MySqlDbType.VarChar, 20));
            Adapter.UpdateCommand.Parameters.Add(new MySqlParameter("DateTO", MySqlDbType.Date));
            Adapter.DeleteCommand = new MySqlCommand("DELETE FROM transport WHERE transport_id=" + ID.ToString(), Transportions.Connection);

            LoadData();

            //Загружаем данные о транспорте
            m_TransportType = new CDAOTransportType(Transportions);
        }

        //public CDAOTransport(CDAOTransportions Transportions, int ID)
        //{
        //    CDAOTransport transport = GetFromDataRow(Transportions.GetTransportRowByID(ID));
        //    m_DateTO = transport.m_DateTO;
        //    m_VIN = transport.m_VIN;
        //    m_ID = transport.m_ID;
        //    m_TransportTypeID = transport.m_TransportTypeID;
        //    return;
        //}
        /// <summary>
        /// Загрузка данных из БД
        /// </summary>
        public void LoadData()
        {
            //Загружаем данные из БД
            MySqlDataReader Reader = Adapter.SelectCommand.ExecuteReader(CommandBehavior.SingleRow);
            if (!Reader.Read())
                throw new InvalidOperationException("Ошибка при получении данных, возможно был задан несуществуиющий индентификатор транспорта.");
            m_ID = Convert.ToInt32(Reader["transport_id"]);
            m_VIN = (String)Reader["vin"];
            m_DateTO = (DateTime)Reader["date_to"];
            m_TransportTypeID = Convert.ToInt32(Reader["transport_type_id"]);
            m_GovNumber = (string)Reader["gov_number"];
            Reader.Close();
        }
        /// <summary>
        /// Выгрузка данных в БД
        /// </summary>
        public void SaveData()
        {
            if (Adapter == null)
                throw new InvalidOperationException("Доступ к базе данных невозможен. Не существует адаптер данных.");
            if (Adapter.UpdateCommand == null)
                throw new InvalidOperationException("Доступ к базе данных невозможен. Недоступна команда одновления данных.");
            if (Adapter.UpdateCommand.Connection == null || Adapter.UpdateCommand.Connection.State != ConnectionState.Open)
                throw new InvalidOperationException("Доступ к базе данных невозможен. Соединение с базой не существует или разорвано. \r\nНеобходимо сначала подключиться к базе.");
            Adapter.UpdateCommand.Parameters["TypeID"].Value = m_TransportTypeID;
            Adapter.UpdateCommand.Parameters["GovNumber"].Value = m_GovNumber;
            Adapter.UpdateCommand.Parameters["VIN"].Value = m_VIN;
            Adapter.UpdateCommand.Parameters["DateTO"].Value = m_DateTO;
            Adapter.UpdateCommand.ExecuteNonQuery();
        }
        /// <summary>
        /// Удалить запись о транспортном средстве из БД
        /// </summary>
        public void DeleteData()
        {
            if (Adapter.DeleteCommand.ExecuteNonQuery() < 1)
                throw new InvalidOperationException("Не было удалено ниодной записи, позможно указан некорректный идентификатор.");
        }
        /// <summary>
        /// Получить данные транспорта из строки таблицы
        /// </summary>
        /// <param name="row">Строка талицы, содержащая данные о транспортом средстве</param>
        /// <returns>Возвращяет данные о транспортном средстве или null в случае ошибки.</returns>
        public static CDAOTransport GetFromDataRow(DataRow row)
        {
            CDAOTransport transport = new CDAOTransport();
            if (row == null)
                throw new NoNullAllowedException("Невозможно получить данные. Строка не существует!");
            transport.m_ID = Convert.ToInt32(row["transport_id"]);
            transport.m_VIN = (string)row["vin"];
            transport.m_TransportTypeID = Convert.ToInt32(row["transport_type_id"]);
            transport.m_DateTO = Convert.ToDateTime(row["date_to"]);
            return transport;
        }
        public int ID
        {
            get
            {
                return m_ID;
            }
            set
            {
                m_ID = value;
                SaveData();
            }
        }
        public String GovNumber
        {
            get
            {
                return m_GovNumber;
            }
            set
            {
                m_GovNumber = value;
                SaveData();
            }
        }
        public int TransportTypeID
        {
            get
            {
                return m_TransportTypeID;
            }
            set
            {
                bool InBase = false;
                foreach (DataRow row in m_TransportType.Table.Rows)
                    if ((string)row["transport_type_id"] == m_TransportTypeID.ToString())
                        InBase = true;
                if (InBase)
                {
                    m_TransportTypeID = value;
                    SaveData();
                }
                else
                {
                    Documentation.ShowError("Ошибка присвоения индекса типа транспортного средства. Индекс не содержиться в базе данных.");
                }
            }
        }
        public String TransportType
        {
            get
            {
                foreach (DataRow row in m_TransportType.Table.Rows)
                    if ((int)row["transport_type_id"] == TransportTypeID)
                        return (string)row["transport_type"];
                Documentation.ShowError("Задан идентификатор несуществующего типа транспорта.");
                return null;
            }
            set
            {
                foreach (DataRow row in m_TransportType.Table.Rows)
                    if (((string)row["transport_type"]).ToUpper() == value.ToUpper())
                    {
                        TransportTypeID = (int)row["transport_type_id"];
                        return;
                    }
                Documentation.ShowError(Documentation.ErrorCode.IncorrectValue_TransportTypeID);
            }
        }
        public String VIN
        {
            get
            {
                return m_VIN;
            }
            set
            {
                m_VIN = value;
                SaveData();
            }
        }
        public DateTime DateTO
        {
            get
            {
                return m_DateTO;
            }
            set
            {
                m_DateTO = value;
                SaveData();
            }
        }
        public String[] TransportTypes
        {
            get
            {
                String[] List = new String[m_TransportType.Table.Rows.Count];
                int i = 0;
                foreach (DataRow row in m_TransportType.Table.Rows)
                {
                    List[i] = (string) row["transport_type"];
                    i++;
                }
                return List;
            }
        }
    }
    
}
